/*
 * 18-mar-2007 
 */
package futbol.tacticas.concursantes2007.Chuky.chuky.equipo;

import java.awt.Point;
import java.util.ArrayList;

import futbol.General;
import futbol.tacticas.concursantes2007.Chuky.chuky.entrenador.*;
import futbol.tacticas.concursantes2007.Chuky.chuky.futbolista.*;

/**
 *
 * @author Joan Crosas
 */
public class Lateral10 extends Futbolista {
	private static final int NUMERO = 10;
	private static final int FUERZA = 7;
	private static final Point POSICION_INICIAL = new Point( -5, 90 );
	private static final Point POSICION_ATAQUE = new Point( 26, 95 );
	private static final Point POSICION_DEFENSA = new Point( 0, 95 );
	
	private Accion accion;
	private Point posicionPreferida;
	
	/**
	 * 
	 * @param numero
	 * @param posicionInicial
	 */
	public Lateral10( EntrenadorListener entrenadorListener ) {
		super( NUMERO, FUERZA, POSICION_INICIAL, entrenadorListener );
		posicionPreferida = POSICION_DEFENSA;
	}

	/**
	 * 
	 */
	public void prepararAccion( ArrayList<Futbolista> amigos ) {
		accion = null;

		if( isBalonControlado() ) {

			if( isBalonEncima() && getPosicion().equals( new Point( 0, 0 ) ) ) {
				accion = new AccionGolpearBalon( this, 0, 160 );
				
			}
			if( accion == null && isBalonEncima() && getPosicion().distance( 160, 30 ) < 126 ) {
				double angulo = General.getAngulo( getPosicion().x, getPosicion().y, 160, 0 );
				accion = new AccionGolpearBalon( this, angulo, 160 );
				
			}
			if( accion == null && isBalonEncima() ) {
				accion = accionPase( amigos );
			}
			if( accion == null ) {
				AnalizadorCamino analizadorCamino = new AnalizadorCamino( getPosicion(), new Point( 160, 0 ), getPosicionEnemigos() );
				Camino caminoPorteria = analizadorCamino.analizar();
				
				Point camino[] = caminoPorteria.getCamino();
				Point irA = getPosicion(); // por si acaso no hubiera ningn camino

				if( camino != null ) {
					int index = 2;
					if( index > camino.length - 1 ) {
						index = camino.length - 1;
					}
					irA = camino[index];
				}

				accion = accionCorrer( irA );
			}

		} else {
			accion = accionCorrer( getPosicionPreferida() );
		}

		// por si las moscas
		if( accion == null ) {
			accion = new AccionCorrer( this, getPosicionPreferida() );
		}
	}

	/**
	 * @param amigos
	 * @return
	 */
	private Accion accionPase( ArrayList<Futbolista> amigos ) {
		Accion accionPase = null;
		
		if( getAnotacion() != null && getAnotacion().getAccion() == Anotacion.ACCION_GOLPEAR_BALON ) {
			Point donde = getAnotacion().getDonde();
			double angulo = General.getAngulo( getPosicion().x, getPosicion().y, donde.x, donde.y );
			accionPase = new AccionGolpearBalon( this, angulo, 100 );

		} else if( accionPase == null && getPosicion().distance( POSICION_ATAQUE ) < 20  ) {
			accionPase = paseMortal02( amigos );
			
		} else if( accionPase == null && getPosicion().distance( POSICION_DEFENSA ) < 12 ) {
			accionPase = paseMortal01( amigos );
			
		} else {
		
			AnalizadorPases analizadorPases = new AnalizadorPases( this, amigos );
			analizadorPases.analizar();
			analizadorPases.filtrarPases( true );
			
			Pase pase = analizadorPases.getPaseMenosMalo();

			if( pase != null ) {
				accionPase = new AccionGolpearBalon( this, pase.getAngulo(), 100 );
				if( pase.getAnotacion() != null ) {		
					getEntrenadorListener().startAnotacion();
					getEntrenadorListener().addAnotacion( pase.getAnotacion() );
				}
			}
		}

		return accionPase;

	}
	
	public Accion getAccion() {
		return accion;
	}
	
	private Accion paseMortal01( ArrayList<Futbolista> amigos ) {
		// sus vays a cagar de lo que estoy planeando
		Anotacion correr07 = new Anotacion();
		correr07.setFutbolista( amigos.get( 7 ) );
		correr07.setAccion( Anotacion.ACCION_CORRER );
		correr07.setDonde( new Point( 80, -20 ) );
		
		Anotacion correr08 = new Anotacion();
		correr08.setFutbolista( amigos.get( 8 ) );
		correr08.setAccion( Anotacion.ACCION_CORRER );
		correr08.setDonde( new Point( 110, 10 ) );
		
		Anotacion[] correr0708 = { correr07, correr08 };
		
		Anotacion pase0708 = new Anotacion();
		pase0708.setFutbolista( amigos.get( 7 ) );
		pase0708.setAccion( Anotacion.ACCION_GOLPEAR_BALON );
		pase0708.setDonde( new Point( 110, 10 ) );
		
		Anotacion gol08 = new Anotacion();
		gol08.setFutbolista( amigos.get( 8 ) );
		gol08.setAccion( Anotacion.ACCION_GOLPEAR_BALON );
		gol08.setDonde( new Point( 160, 26 ) );
		
		getEntrenadorListener().startAnotacion();
		getEntrenadorListener().addAnotacion( correr0708 );
		getEntrenadorListener().addAnotacion( pase0708 );
		getEntrenadorListener().addAnotacion( gol08 );
		
		// empieza la jugada mortal!
		Point posBalon = getBalon().getPosicionBalon();
		double angulo = General.getAngulo( posBalon.x, posBalon.y, 80, -20 );
		Accion paseMortal = new AccionGolpearBalon( this, angulo, 200 );
		
		return paseMortal;
	}
	
	private Accion paseMortal02( ArrayList<Futbolista> amigos ) {
		// sus vays a cagar de lo que estoy planeando
		Anotacion correr07 = new Anotacion();
		correr07.setFutbolista( amigos.get( 7 ) );
		correr07.setAccion( Anotacion.ACCION_CORRER );
		correr07.setDonde( new Point( 120, -20 ) );
		
		Anotacion correr08 = new Anotacion();
		correr08.setFutbolista( amigos.get( 8 ) );
		correr08.setAccion( Anotacion.ACCION_CORRER );
		correr08.setDonde( new Point( 120, 20 ) );
		
		Anotacion[] correr0708 = { correr07, correr08 };
		
		Anotacion gol08 = new Anotacion();
		gol08.setFutbolista( amigos.get( 7 ) );
		gol08.setAccion( Anotacion.ACCION_GOLPEAR_BALON );
		gol08.setDonde( new Point( 160, 25 ) );
		
		getEntrenadorListener().startAnotacion();
		getEntrenadorListener().addAnotacion( correr0708 );
		getEntrenadorListener().addAnotacion( gol08 );
		
		// empieza la jugada mortal!
		Point posBalon = getBalon().getPosicionBalon();
		double angulo = General.getAngulo( posBalon.x, posBalon.y, 120, 20 );
		Accion paseMortal = new AccionGolpearBalon( this, angulo, 200 );
		
		return paseMortal;
	}

	public Point getPosicionPreferida() {
		if( getAnotacion() != null && getAnotacion().getAccion() == Anotacion.ACCION_CORRER ) {
			posicionPreferida = getAnotacion().getDonde();

		} else if( getTipoJuego() == Entrenador.ATAQUE && getBalon().getPosicionBalon().x > -66 ) {
			posicionPreferida = POSICION_ATAQUE;

		} else {
			posicionPreferida = POSICION_DEFENSA;
			
		}
		return posicionPreferida;
	}
}

